package com.zxjbyte.yiyi.module.system.domain.entity;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.zxjbyte.yiyi.framework.tenant.db.TenantBasePO;
import lombok.Data;

import java.util.Date;

/**
 * @Author zhangxingjia
 * @Date 2023/3/17 17:43
 * @Version: 1.0
 */
@Data
@TableName("sys_error_log")
public class ErrorLogPO extends TenantBasePO {

    private static final long serialVersionUID = 3841491429344179444L;

    // 参数最大长度
    public static final int REQUEST_PARAMS_MAX_LENGTH = 8000;

    // 自增主键
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    // 用户编号
    @TableField("user_id")
    private Long userId;

    // 应用名
    @TableField("application_name")
    private String applicationName;

    // 请求方法名
    @TableField("request_method")
    private String requestMethod;

    // 访问地址
    @TableField("request_url")
    private String requestUrl;

    // 请求参数 query: Query String Quest Body
    @TableField("request_params")
    private String requestParams;

    // 用户 IP
    @TableField("user_ip")
    private String userIp;

    // 浏览器 UA
    @TableField("user_agent")
    private String userAgent;

    // 异常发生时间
    @TableField("exception_time")
    private Date exceptionTime;

    // 异常名
    @TableField("exception_name")
    private String exceptionName;

    // 异常导致的消息
    @TableField("exception_message")
    private String exceptionMessage;

    // 异常导致的根消息
    @TableField("exception_root_cause_message")
    private String exceptionRootCauseMessage;

    // 异常的栈轨迹
    @TableField("exception_stack_trace")
    private String exceptionStackTrace;

    // 异常发生的类全名
    @TableField("exception_class_name")
    private String exceptionClassName;

    // 异常发生的类文件
    @TableField("exception_file_name")
    private String exceptionFileName;

    // 异常发生的方法名
    @TableField("exception_method_name")
    private String exceptionMethodName;

    // 异常发生的方法所在行
    @TableField("exception_line_number")
    private Integer exceptionLineNumber;

    // 处理状态 0:未处理, 1:已处理, 2:已忽略
    @TableField("process_status")
    private Integer processStatus;

    // 处理时间
    @TableField("process_time")
    private Date processTime;

    // 处理用户编号
    @TableField("process_user_id")
    private Long processUserId;

    // 处理备注
    @TableField("process_remarks")
    private String processRemarks;

    public void setRequestParams(String requestParams) {
        if(StrUtil.length(requestParams) > REQUEST_PARAMS_MAX_LENGTH) {
            this.requestParams = StrUtil.sub(requestParams, 0, REQUEST_PARAMS_MAX_LENGTH);
        } else {
            this.requestParams = requestParams;
        }
    }
}
